/**  
 * All rights Reserved, Designed By <a href="www.itttq.com" target="_blank">www.itttq.com</a>
 * @date:   2018年1月3日 下午1:03:51
 * @Copyright: 2018 <a href="www.itttq.com" target="_blank">www.itttq.com</a> Inc. All rights reserved. 
 */
package com.itttq.gshop.generic.util;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName: BeanUtils
 * @author: 迷蝶
 * @date: 2018年1月3日 下午1:03:51
 * 
 * @Copyright: 2018 <a href="www.itttq.com" target="_blank">www.itttq.com</a>
 *             Inc. All rights reserved.
 */
public class BeanUtil {
	/**
	 * 多个java bean转换为Map对象，相同属性会被最后一个对象的覆盖，<br>
	 * key为bean的属性值（未做任何转换），只有属性不为空的才会转换为Map。为空的则属性则舍弃
	 * 
	 * @param beans
	 * @return	如果转换出现异常，则返回null，需要自行处理
	 * @Author 迷蝶
	 * @return Map<String,Object>
	 */
	public static Map<String, Object> bean2Map(Object... beans) {
		Map<String, Object> returnMap = new HashMap<String, Object>();
		for(Object bean : beans) {
			Map<String, Object> map = bean2Map(bean);
			if(null == map) return null;
			returnMap.putAll(map);
		}
		return returnMap;
	}
	
	/**
	 * java bean转换为Map对象，key为bean的属性值（未做任何转换）。<br>
	 * 只有属性不为空的才会转换为Map。为空的则属性则舍弃。
	 * 
	 * @param bean
	 * @return	如果转换出现异常，则返回null，需要自行处理
	 * @Author 迷蝶
	 * @return Map<String,Object>
	 */
	public static Map<String, Object> bean2Map(Object bean) {
		Map<String, Object> returnMap = new HashMap<String, Object>();
		try {
			BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			for (PropertyDescriptor pd : propertyDescriptors) {
				String propertyName = pd.getName();
				if (propertyName.equals("class")) continue;
				Object value = pd.getReadMethod().invoke(bean);
				// 值不为空才会put到map中
				if (null != propertyName && null != value) {
					propertyName = propertyName.toString();
					returnMap.put(propertyName, value);
				}
			}
		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | IntrospectionException e) {
			returnMap = null;
			e.printStackTrace();
		}
		return returnMap;
	}
}
